home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload Trio 2 / Shareware Overload Trio Volume 2 (Chestnut CD-ROM).ISO / dir44 / dungn32.zip / ROOMS.FOR < prev    next >
Text File  |  1994-10-08  |  30KB  |  858 lines

  1. C Room processors for DUNGEON
  2. C
  3. C COPYRIGHT 1980, 1990, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA.
  4. C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
  5. C WRITTEN BY R. M. SUPNIK
  6. C
  7. C 11-Sep-94     RMS     Fixed bugs in Tree, Slide, Cave2, Magnet, object
  8. C                       substitution.  Added Puzzle Anteroom.
  9. C 30-Jun-92     RMS     Changed file names to lower case.
  10. C
  11. C RAPPLI- Room routines
  12. C
  13. C Declarations
  14. C
  15.       SUBROUTINE RAPPLI(RI)
  16.       IMPLICIT INTEGER (A-Z)
  17.       INCLUDE 'dparam.for'
  18.       LOGICAL QOPEN,QON,QHERE,PROB,F
  19.       LOGICAL MOVETO,LIT,RMDESC,QEMPTY
  20. C
  21. C Functions and data
  22. C
  23.       QOPEN(R)=(OFLAG2(R).AND.OPENBT).NE.0
  24.       QON(R)=(OFLAG1(R).AND.ONBT).NE.0
  25. C
  26.       IF(RI.EQ.0) RETURN                        ! return if naught.
  27.       GO TO (  1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000,
  28.      110000,11000,12000,13000,14000,15000,16000,17000,18000,19000,
  29.      220000,21000,22000,23000,24000,25000,26000,27000,28000,29000,
  30.      330000,31000,32000,33000,34000,35000,36000,37000,38000,39000,
  31.      440000,41000,42000,43000,44000,45000,46000,47000,48000,49000,
  32.      550000,51000,52000,53000,54000,55000,56000,57000,58000,59000,
  33.      760000,61000,62000,63000,64000),RI
  34.       CALL BUG(1,RI)
  35.  
  36. C RAPPLI, PAGE 2
  37. C
  38. C R1--  East of house
  39. C
  40. 1000  IF(PRSA.NE.LOOKW) RETURN                  ! look?
  41.       I=13                                      ! assume closed.
  42.       IF(QOPEN(WINDO)) I=12                     ! if open, ajar.
  43.       CALL RSPSUB(11,I)                         ! describe.
  44.       RETURN
  45. C
  46. C R2--  Kitchen
  47. C
  48. 2000  IF(PRSA.NE.LOOKW) GO TO 2100              ! look?
  49.       I=13                                      ! assume closed.
  50.       IF(QOPEN(WINDO)) I=12                     ! if open, ajar.
  51.       CALL RSPSUB(14,I)                         ! describe.
  52.       RETURN
  53. C
  54. 2100  IF((PRSA.NE.WALKIW).OR.DEADF.OR..NOT.BROC1F.OR.BROC2F) RETURN
  55.       CFLAG(CEVBRO)=.TRUE.                      ! send for brochure.
  56.       CTICK(CEVBRO)=3
  57.       RETURN
  58. C
  59. C R3--  Living Room
  60. C
  61. 3000  IF(PRSA.NE.LOOKW) GO TO 3500              ! look?
  62.       I=15                                      ! assume no hole.
  63.       IF(MAGICF) I=16                           ! if magicf, cyclops hole.
  64.       CALL RSPEAK(I)                            ! describe.
  65.       I=17+ORRUG                                ! assume initial state.
  66.       IF(QOPEN(DOOR)) I=I+2                     ! door open?
  67.       CALL RSPEAK(I)                            ! describe.
  68.       RETURN
  69. C
  70. C Not a look word, reevaluate trophy case.
  71. C
  72. 3500  IF((PRSA.NE.TAKEW).AND.((PRSA.NE.PUTW).OR.(PRSI.NE.TCASE)))
  73.      1RETURN                                    ! take or put in?
  74.       ASCORE(WINNER)=RWSCOR                     ! score trophy case.
  75.       DO 3600 I=1,OLNT                          ! retain raw score as well.
  76.         J=I                                     ! find out if in case.
  77. 3550    J=OCAN(J)                               ! trace ownership.
  78.         IF(J.EQ.0) GO TO 3600
  79.         IF(J.NE.TCASE) GO TO 3550               ! do all levels.
  80.         ASCORE(WINNER)=ASCORE(WINNER)+OTVAL(I)
  81. 3600  CONTINUE
  82.       CALL SCRUPD(0)                            ! see if endgame trig.
  83.       RETURN
  84.  
  85. C RAPPLI, PAGE 3
  86. C
  87. C R4--  Cellar
  88. C
  89. 4000  IF(PRSA.NE.LOOKW) GO TO 4500              ! look?
  90.       CALL RSPEAK(21)                           ! describe cellar.
  91.       IF(QOPEN(DOOR)) CALL RSPEAK(623)          ! describe trap door if open.
  92.       RETURN
  93. C
  94. 4500  IF(PRSA.NE.WALKIW) RETURN                 ! walkin?
  95.       IF((OFLAG2(DOOR).AND.(OPENBT+TCHBT)).NE.OPENBT) RETURN
  96.       OFLAG2(DOOR)=(OFLAG2(DOOR).OR.TCHBT).AND. .NOT.OPENBT
  97.       CALL RSPEAK(22)                           ! slam and bolt door.
  98.       RETURN
  99. C
  100. C R5--  Grating Room
  101. C
  102. 5000  IF(PRSA.NE.LOOKW) RETURN                  ! look?
  103.       CALL RSPEAK(23)                           ! describe.
  104.       I=24                                      ! assume locked.
  105.       IF(GRUNLF) I=26                           ! unlocked?
  106.       IF(QOPEN(GRATE)) I=25                     ! open?
  107.       CALL RSPEAK(I)                            ! describe grate.
  108.       RETURN
  109. C
  110. C R6--  Clearing
  111. C
  112. 6000  IF(PRSA.NE.LOOKW) RETURN                  ! look?
  113.       CALL RSPEAK(27)                           ! describe.
  114.       I=0                                       ! assume no grating.
  115.       IF(RVCLR.NE.0) I=28                       ! leaves moved?
  116.       IF(QOPEN(GRATE)) I=29                     ! grate open?
  117.       CALL RSPEAK(I)                            ! describe grate.
  118.       RETURN
  119.  
  120. C RAPPLI, PAGE 4
  121. C
  122. C R7--  Reservoir south
  123. C
  124. 7000  IF(PRSA.NE.LOOKW) RETURN                  ! look?
  125.       I=31                                      ! assume full.
  126.       IF(LWTIDF) I=32                           ! if low tide, empty.
  127.       CALL RSPEAK(I)                            ! describe.
  128.       CALL RSPEAK(33)                           ! describe exits.
  129.       RETURN
  130. C
  131. C R8--  Reservoir
  132. C
  133. 8000  IF(PRSA.NE.LOOKW) RETURN                  ! look?
  134.       I=34                                      ! assume full.
  135.       IF(LWTIDF) I=35                           ! if low tide, emtpy.
  136.       CALL RSPEAK(I)                            ! describe.
  137.       RETURN
  138. C
  139. C R9--  Reservoir north
  140. C
  141. 9000  IF(PRSA.NE.LOOKW) RETURN                  ! look?
  142.       I=36                                      ! you get the idea.
  143.       IF(LWTIDF) I=37
  144.       CALL RSPEAK(I)
  145.       CALL RSPEAK(38)
  146.       RETURN
  147. C
  148. C R10-- Glacier Room
  149. C
  150. 10000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  151.       CALL RSPEAK(39)                           ! basic description.
  152.       I=0                                       ! assume no changes.
  153.       IF(GLACMF) I=40                           ! partial melt?
  154.       IF(GLACRF) I=41                           ! complete melt?
  155.       CALL RSPEAK(I)                            ! describe.
  156.       RETURN
  157. C
  158. C R11-- Forest Room
  159. C
  160. 11000 IF(PRSA.NE.WALKIW) RETURN
  161.       CFLAG(CEVFOR)=.TRUE.                      ! if walk in, birdie.
  162.       CTICK(CEVFOR)=-1
  163.       RETURN
  164. C
  165. C R12-- Mirror Room
  166. C
  167. 12000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  168.       CALL RSPEAK(42)                           ! describe.
  169.       IF(MIRRMF) CALL RSPEAK(43)                ! if broken, nasty remark.
  170.       RETURN
  171.  
  172. C RAPPLI, PAGE 5
  173. C
  174. C R13-- Cave2
  175. C
  176. 13000 IF(PRSA.NE.WALKIW) RETURN                 ! walkin?
  177.       IF(PROB(50,20).OR.(OADV(CANDL).NE.WINNER).OR.
  178.      1.NOT.QON(CANDL)) RETURN                   ! blow em out?
  179.       OFLAG1(CANDL)=OFLAG1(CANDL).AND. .NOT. ONBT ! yes.
  180.       CALL RSPEAK(47)                           ! tell of winds.
  181.       CFLAG(CEVCND)=.FALSE.                     ! halt candle countdown.
  182.       IF(.NOT.LIT(HERE)) CALL RSPEAK(406)       ! now pitch black.
  183.       RETURN
  184. C
  185. C R14-- Boom Room
  186. C
  187. 14000 J=ODESC2(CANDL)                           ! assume candle.
  188.       IF((OADV(CANDL).EQ.WINNER).AND.QON(CANDL)) GO TO 14100
  189.       J=ODESC2(TORCH)                           ! assume torch.
  190.       IF((OADV(TORCH).EQ.WINNER).AND.QON(TORCH)) GO TO 14100
  191.       J=ODESC2(MATCH)
  192.       IF((OADV(MATCH).EQ.WINNER).AND.QON(MATCH)) GO TO 14100
  193.       RETURN                                    ! safe
  194. C
  195. 14100 IF((PRSA.NE.TRNONW).AND.(PRSA.NE.BURNW))
  196.      1GO TO 14200                               ! turn on or burn?
  197.       CALL RSPSUB(294,J)                        ! boom!
  198.       CALL JIGSUP(44)
  199.       RETURN
  200. C
  201. 14200 IF(PRSA.NE.WALKIW) RETURN                 ! walkin?
  202.       CALL RSPSUB(295,J)                        ! boom!
  203.       CALL JIGSUP(44)
  204.       RETURN
  205. C
  206. C R15-- No-objs
  207. C
  208. 15000 EMPTHF=.TRUE.                             ! assume true.
  209.       DO 15100 I=1,OLNT                         ! see if carrying.
  210.         IF(OADV(I).EQ.WINNER) EMPTHF=.FALSE.
  211. 15100 CONTINUE
  212. C
  213.       IF((HERE.NE.BSHAF).OR.(.NOT.LIT(HERE))) RETURN
  214.       CALL SCRUPD(LTSHFT)                       ! score light shaft.
  215.       LTSHFT=0                                  ! never again.
  216.       RETURN
  217.  
  218. C RAPPLI, PAGE 6
  219. C
  220. C R16-- Machine Room
  221. C
  222. 16000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  223.       I=46                                      ! assume lid closed.
  224.       IF(QOPEN(MACHI)) I=12                     ! if open, open.
  225.       CALL RSPSUB(45,I)                         ! describe.
  226.       RETURN
  227. C
  228. C R17-- Bat Room
  229. C
  230. 17000 IF(PRSA.NE.LOOKW) GO TO 17500             ! look?
  231.       CALL RSPEAK(48)                           ! describe room.
  232.       IF(OADV(GARLI).EQ.WINNER) CALL RSPEAK(49) ! bat holds nose.
  233.       RETURN
  234. C
  235. 17500 IF((PRSA.NE.WALKIW).OR.(OADV(GARLI).EQ.WINNER)
  236.      1.OR.DEADF) RETURN                         ! garlic or dead?
  237.       CALL RSPEAK(50)                           ! time to fly, jack.
  238.       F=MOVETO(BATDRP(RND(9)+1),WINNER)         ! select random dest.
  239.       F=RMDESC(0)                               ! new room description.
  240.       PRSCON=0                                  ! kill parser.
  241.       RETURN
  242. C
  243. C R18-- Dome Room
  244. C
  245. 18000 IF(PRSA.NE.LOOKW) GO TO 18500             ! look?
  246.       CALL RSPEAK(51)                           ! describe.
  247.       IF(DOMEF) CALL RSPEAK(52)                 ! if rope, describe.
  248.       RETURN
  249. C
  250. 18500 IF(PRSA.EQ.LEAPW) CALL JIGSUP(53)         ! did he jump???
  251.       RETURN
  252. C
  253. C R19-- Torch Room
  254. C
  255. 19000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  256.       CALL RSPEAK(54)                           ! describe.
  257.       IF(DOMEF) CALL RSPEAK(55)                 ! if rope, describe.
  258.       RETURN
  259. C
  260. C R20-- Carousel Room
  261. C
  262. 20000 IF(PRSA.NE.LOOKW) GO TO 20500             ! look?
  263.       CALL RSPEAK(56)                           ! describe.
  264.       IF(.NOT.(CAROFF.OR.DEADF)) CALL RSPEAK(57) ! if not flipped, spin.
  265.       RETURN
  266. C
  267. 20500 IF((PRSA.EQ.WALKIW).AND.CAROZF.AND..NOT.DEADF)
  268.      1CALL JIGSUP(58)                           ! walked in, zoom, not dead.
  269.       RETURN
  270.  
  271. C RAPPLI, PAGE 7
  272. C
  273. C R21-- Land of the Living Dead
  274. C
  275. 21000 IF(PRSA.NE.LOOKW) GO TO 21100             ! look?
  276.       CALL RSPEAK(59)                           ! describe.
  277.       IF(.NOT.LLDF) CALL RSPEAK(60)             ! if not vanished, ghosts.
  278.       RETURN
  279. C
  280. 21100 IF(LLDF.OR.(PRSA.NE.RINGW).OR.(PRSO.NE.BELL))
  281.      1GO TO 21200                               ! ring bell?
  282.       EXORBF=.TRUE.                             ! set exorcism bell flag.
  283.       CALL NEWSTA(BELL,0,0,0,0)                 ! vanish bell.
  284.       CALL NEWSTA(HBELL,967,HERE,0,0)           ! insert hot bell.
  285.       IF(LASTIT.EQ.BELL) LASTIT=HBELL           ! fix last it reference.
  286.       IF(.NOT.QON(CANDL).OR.(OADV(CANDL).NE.WINNER))
  287.      1GO TO 21150                               ! carrying lit candles?
  288.       CALL NEWSTA(CANDL,968,HERE,0,0)           ! drop and go out.
  289.       OFLAG1(CANDL)=OFLAG1(CANDL).AND..NOT.ONBT
  290.       CFLAG(CEVCND)=.FALSE.                     ! disable candle timer.
  291. 21150 CFLAG(CEVXB)=.TRUE.                       ! start bell timer.
  292.       CTICK(CEVXB)=6
  293.       CFLAG(CEVXBH)=.TRUE.                      ! start cooling timer.
  294.       CTICK(CEVXBH)=20
  295.       RETURN
  296. C
  297. 21200 IF(.NOT.EXORBF.OR.EXORCF.OR.(OADV(CANDL).NE.WINNER).OR.
  298.      1((OFLAG1(CANDL).AND.ONBT).EQ.0)) GO TO 21300
  299.       EXORCF=.TRUE.                             ! set exorcism candle flag.
  300.       CALL RSPEAK(969)
  301.       CFLAG(CEVXB)=.FALSE.                      ! turn off bell timer.
  302.       CFLAG(CEVXC)=.TRUE.                       ! turn on candle timer.
  303.       CTICK(CEVXC)=3
  304.       RETURN
  305. C
  306. 21300 IF(.NOT.EXORCF.OR.(PRSA.NE.READW).OR.(PRSO.NE.BOOK))
  307.      1GO TO 21400                               ! read book?
  308.       CALL NEWSTA(GHOST,63,0,0,0)               ! exorcism complete.
  309.       LLDF=.TRUE.                               ! set flag.
  310.       CFLAG(CEVXC)=.FALSE.                      ! turn off candle timer.
  311.       RETURN
  312. C
  313. 21400 IF(PRSA.NE.EXORCW) RETURN                 ! trying exorcism?
  314.       IF(LLDF) GO TO 21600                      ! trying again?
  315.       IF((OADV(BELL).EQ.WINNER).AND.(OADV(BOOK).EQ.WINNER).AND.
  316.      1(OADV(CANDL).EQ.WINNER).AND.QON(CANDL)) GO TO 21500
  317.       CALL RSPEAK(62)                           ! not equipped.
  318.       RETURN
  319. C
  320. 21500 CALL RSPEAK(1044)                         ! must do it the hard way.
  321.       RETURN
  322. C
  323. 21600 CALL JIGSUP(61)                           ! twice, exorcise you.
  324.       RETURN
  325.  
  326. C RAPPLI, PAGE 7A
  327. C
  328. C R22-- Land of the Living Dead interior
  329. C
  330. 22000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  331.       CALL RSPEAK(64)                           ! describe.
  332.       IF(ONPOLF) CALL RSPEAK(65)                ! on pole?
  333.       RETURN
  334. C
  335. C R23-- Dam Room
  336. C
  337. 23000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  338.       CALL RSPEAK(66)                           ! describe.
  339.       I=67
  340.       IF(LWTIDF) I=68
  341.       CALL RSPEAK(I)                            ! describe reservoir.
  342.       CALL RSPEAK(69)                           ! describe panel.
  343.       IF(GATEF) CALL RSPEAK(70)                 ! bubble is glowing.
  344.       RETURN
  345. C
  346. C R24-- Tree Room
  347. C
  348. 24000 IF(PRSA.NE.LOOKW) GO TO 24300             ! look?
  349.       CALL RSPEAK(660)                          ! describe.
  350.       I=661                                     ! set flag for below.
  351.       DO 24200 J=1,OLNT                         ! describe obj in fore3.
  352.         IF(.NOT.QHERE(J,FORE3).OR.(J.EQ.FTREE)) GO TO 24200
  353.         CALL RSPEAK(I)                          ! set stage,
  354.         I=0
  355.         CALL RSPSUB(502,ODESC2(J))              ! describe.
  356. 24200 CONTINUE
  357.       RETURN
  358. C
  359. 24300 IF(PRSA.NE.WALKIW) GO TO 24400            ! walk in?
  360.       CFLAG(CEVFOR)=.TRUE.                      ! start forest noise timer.
  361.       CTICK(CEVFOR)=-1
  362.       RETURN
  363. C
  364. 24400 IF((PRSA.NE.DROPW).AND.(PRSA.NE.THROWW).AND.(PRSA.NE.SHAKEW))
  365.      1RETURN                                    ! drop, throw, shake?
  366.       DO 24600 I=1,OLNT                         ! loop through objects
  367.         IF((I.EQ.TTREE).OR.(I.EQ.NEST).OR.
  368.      1.NOT.QHERE(I,HERE)) GO TO 24600   !  is it here?
  369.         IF(I.EQ.EGG) GO TO 24500                ! egg?
  370.         CALL NEWSTA(I,0,FORE3,0,0)              ! no, drop to forest floor.
  371.         CALL RSPSUB(659,ODESC2(I))
  372.         GO TO 24600
  373. C
  374. 24500   CALL NEWSTA(EGG,0,0,0,0)                ! vanish egg.
  375.         CALL NEWSTA(BEGG,658,FORE3,0,0)         ! insert broken egg.
  376.         IF(LASTIT.EQ.EGG) LASTIT=BEGG           ! fix last it reference.
  377.         OTVAL(BEGG)=2
  378.         IF(OCAN(CANAR).NE.EGG) GO TO 24550      ! canary inside?
  379.         OTVAL(BCANA)=1
  380.         GO TO 24600
  381. 24550   CALL NEWSTA(BCANA,0,0,0,0)              ! no, vanish broken canary.
  382. 24600 CONTINUE
  383.       RETURN
  384.  
  385. C RAPPLI, PAGE 8
  386. C
  387. C R25-- Cyclops Room
  388. C
  389. 25000 IF(PRSA.NE.LOOKW) GO TO 25100             ! look?
  390.       CALL RSPEAK(606)                          ! describe.
  391.       I=607                                     ! assume basic state.
  392.       IF(RVCYC.GT.0) I=608                      ! >0?  hungry.
  393.       IF(RVCYC.LT.0) I=609                      ! <0?  thirsty.
  394.       IF(CYCLOF) I=610                          ! asleep?
  395.       IF(MAGICF) I=611                          ! gone?
  396.       CALL RSPEAK(I)                            ! describe.
  397.       RETURN
  398. C
  399. 25100 IF((PRSA.NE.WALKIW).OR.(RVCYC.EQ.0).OR.DEADF) RETURN
  400.       CFLAG(CEVCYC)=.TRUE.                      ! walked in, restart timer.
  401.       CTICK(CEVCYC)=-1
  402.       RETURN
  403. C
  404. C R26-- Bank Box Room
  405. C
  406. 26000 IF(PRSA.NE.WALKIW) RETURN                 ! surprise him.
  407.       DO 26100 I=1,8,2                          ! scolrm depends on
  408.         IF(FROMDR.EQ.SCOLDR(I)) SCOLRM=SCOLDR(I+1)
  409. 26100 CONTINUE                                  ! entry direction.
  410.       RETURN
  411. C
  412. C R27-- Treasure Room
  413. C
  414. 27000 IF((PRSA.NE.WALKIW).OR.DEADF.OR..NOT.THFACT)
  415.      1RETURN                                    ! walkin, thief active?
  416.       IF(OROOM(THIEF).NE.HERE)
  417.      1CALL NEWSTA(THIEF,82,HERE,0,0)            ! no, materialize him.
  418.       THFPOS=HERE                               ! reset search pattern.
  419.       OFLAG2(THIEF)=OFLAG2(THIEF).OR.FITEBT     ! he's angry.
  420. C
  421. C Vanish everything in room.
  422. C
  423.       J=0                                       ! assume nothing to vanish.
  424.       DO 27200 I=1,OLNT
  425.         IF((I.EQ.CHALI).OR.(I.EQ.THIEF).OR..NOT.QHERE(I,HERE))
  426.      1GO TO 27200                               ! here?
  427.         J=83                                    ! flag byebye.
  428.         OFLAG1(I)=OFLAG1(I).AND..NOT.VISIBT     ! away it goes.
  429. 27200 CONTINUE
  430.       CALL RSPEAK(J)                            ! describe.
  431.       RETURN
  432. C
  433. C R28-- Cliff Room
  434. C
  435. 28000 DEFLAF=OADV(RBOAT).NE.WINNER              ! true if not carrying.
  436.       RETURN
  437.  
  438. C RAPPLI, PAGE 9
  439. C
  440. C R29-- Rivr4 Room
  441. C
  442. 29000 IF(BUOYF.OR.(OADV(BUOY).NE.WINNER)) RETURN
  443.       CALL RSPEAK(84)                           ! give hint,
  444.       BUOYF=.TRUE.                              ! then disable.
  445.       RETURN
  446. C
  447. C R30-- Overfalls
  448. C
  449. 30000 IF(PRSA.NE.LOOKW) CALL JIGSUP(85)         ! over you go.
  450.       RETURN
  451. C
  452. C R31-- Slide Ledge
  453. C
  454. 31000 IF(PRSA.NE.WALKIW) RETURN                 ! walk in?
  455.       CFLAG(CEVSLI)=.FALSE.                     ! disable slippery rope.
  456.       RETURN
  457. C
  458. C R32-- Slide
  459. C
  460. 32000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  461.       CALL RSPEAK(1012)                         ! describe.
  462.       IF(TTIE.EQ.0) RETURN                      ! timber tied?
  463.       IF(OROOM(TTIE).EQ.HERE) CALL RSPSUB(1013,ODESC2(TTIE))
  464.       RETURN
  465. C
  466. C R33-- Aragain Falls
  467. C
  468. 33000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  469.       CALL RSPEAK(96)                           ! describe.
  470.       I=97                                      ! assume no rainbow.
  471.       IF(RAINBF) I=98                           ! got one?
  472.       CALL RSPEAK(I)                            ! describe.
  473.       RETURN
  474.  
  475. C RAPPLI, PAGE 10
  476. C
  477. C R34-- Ledge Room
  478. C
  479. 34000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  480.       CALL RSPEAK(100)                          ! describe.
  481.       I=102                                     ! assume safe room ok.
  482.       IF((RFLAG(MSAFE).AND.RMUNG).NE.0) I=101   ! if munged, room gone.
  483.       CALL RSPEAK(I)                            ! describe.
  484.       RETURN
  485. C
  486. C R35-- Safe Room
  487. C
  488. 35000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  489.       CALL RSPEAK(104)                          ! describe.
  490.       I=105                                     ! assume ok.
  491.       IF(SAFEF) I=106                           ! blown?
  492.       CALL RSPEAK(I)                            ! describe.
  493.       RETURN
  494. C
  495. C R36-- Magnet Room
  496. C
  497. 36000 IF(PRSA.NE.LOOKW) GO TO 36500             ! look?
  498.       CALL RSPEAK(107)                          ! describe.
  499.       RETURN
  500. C
  501. 36500 IF((PRSA.NE.WALKIW).OR.DEADF.OR..NOT.CAROFF) RETURN ! walkin?
  502.       IF(CAROZF) GO TO 36600                    ! zoom?
  503.       IF(WINNER.EQ.PLAYER) CALL RSPEAK(108)     ! no, spin his compass.
  504.       RETURN
  505. C
  506. 36600 I=58                                      ! spin his insides.
  507.       IF(WINNER.NE.PLAYER) I=99                 ! spin robot.
  508.       CALL JIGSUP(I)                            ! dead.
  509.       RETURN
  510. C
  511. C R37-- Cage Room
  512. C
  513. 37000 IF(CAGESF) F=MOVETO(CAGER,WINNER)         ! if solved, move.
  514.       RETURN
  515.  
  516. C RAPPLI, PAGE 11
  517. C
  518. C R38-- Mirror D Room
  519. C
  520. 38000 IF(PRSA.EQ.LOOKW) CALL LOOKTO(FDOOR,MRG,0,682,681)
  521.       RETURN
  522. C
  523. C R39-- Mirror G Room
  524. C
  525. 39000 IF(PRSA.EQ.WALKIW) CALL JIGSUP(685)
  526.       RETURN
  527. C
  528. C R40-- Mirror C Room
  529. C
  530. 40000 IF(PRSA.EQ.LOOKW) CALL LOOKTO(MRG,MRB,683,0,681)
  531.       RETURN
  532. C
  533. C R41-- Mirror B Room
  534. C
  535. 41000 IF(PRSA.EQ.LOOKW) CALL LOOKTO(MRC,MRA,0,0,681)
  536.       RETURN
  537. C
  538. C R42-- Mirror A Room
  539. C
  540. 42000 IF(PRSA.EQ.LOOKW) CALL LOOKTO(MRB,0,0,684,681)
  541.       RETURN
  542.  
  543. C RAPPLI, PAGE 12
  544. C
  545. C R43-- Mirror C East/West
  546. C
  547. 43000 IF(PRSA.EQ.LOOKW) CALL EWTELL(HERE,683)
  548.       RETURN
  549. C
  550. C R44-- Mirror B East/West
  551. C
  552. 44000 IF(PRSA.EQ.LOOKW) CALL EWTELL(HERE,686)
  553.       RETURN
  554. C
  555. C R45-- Mirror A East/West
  556. C
  557. 45000 IF(PRSA.EQ.LOOKW) CALL EWTELL(HERE,687)
  558.       RETURN
  559. C
  560. C R46-- Inside Mirror
  561. C
  562. 46000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  563.       CALL RSPEAK(688)                          ! describe
  564. C
  565. C Now describe pole state.
  566. C
  567. C Cases 1,2--   MDIR=270 & MLOC=MRB, pole is up or in hole
  568. C Cases 3,4--   MDIR=0 V MDIR=180, pole is up or in channel
  569. C Case 5--      Pole is up
  570. C
  571.       I=689                                     ! assume case 5.
  572.       IF((MDIR.EQ.270).AND.(MLOC.EQ.MRB))
  573.      1I=690+MIN0(POLEUF,1)                      ! cases 1,2.
  574.       IF(MOD(MDIR,180).EQ.0)
  575.      1I=692+MIN0(POLEUF,1)                      ! cases 3,4.
  576.       CALL RSPEAK(I)                            ! describe pole.
  577.       CALL RSPSUB(694,695+(MDIR/45))            ! describe arrow.
  578.       RETURN
  579.  
  580. C RAPPLI, PAGE 13
  581. C
  582. C R47-- Mirror Eye Room
  583. C
  584. 47000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  585.       I=704                                     ! assume beam stop.
  586.       DO 47100 J=1,OLNT
  587.         IF(QHERE(J,HERE).AND.(J.NE.RBEAM)) GO TO 47200
  588. 47100 CONTINUE
  589.       I=703
  590. 47200 CALL RSPSUB(I,ODESC2(J))                  ! describe beam.
  591.       CALL LOOKTO(MRA,0,0,0,0)                  ! look north.
  592.       RETURN
  593. C
  594. C R48-- Inside Crypt
  595. C
  596. 48000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  597.       I=46                                      ! crypt is open/closed.
  598.       IF(QOPEN(TOMB)) I=12
  599.       CALL RSPSUB(705,I)
  600.       RETURN
  601. C
  602. C R49-- South Corridor
  603. C
  604. 49000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  605.       CALL RSPEAK(706)                          ! describe.
  606.       I=46                                      ! odoor is open/closed.
  607.       IF(QOPEN(ODOOR)) I=12
  608.       IF(LCELL.EQ.4) CALL RSPSUB(707,I)         ! describe odoor if there.
  609.       RETURN
  610. C
  611. C R50-- Behind Door
  612. C
  613. 50000 IF(PRSA.NE.WALKIW) GO TO 50100            ! walk in?
  614.       CFLAG(CEVFOL)=.TRUE.                      ! master follows.
  615.       CTICK(CEVFOL)=-1
  616.       RETURN
  617. C
  618. 50100 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  619.       I=46                                      ! qdoor is open/closed.
  620.       IF(QOPEN(QDOOR)) I=12
  621.       CALL RSPSUB(708,I)
  622.       RETURN
  623.  
  624. C RAPPLI, PAGE 14
  625. C
  626. C R51-- Front Door
  627. C
  628. 51000 IF(PRSA.EQ.WALKIW) CTICK(CEVFOL)=0        ! if exits, kill follow.
  629.       IF(PRSA.NE.LOOKW) RETURN                  ! look?
  630.       CALL LOOKTO(0,MRD,709,0,0)                ! describe south.
  631.       I=46                                      ! panel is open/closed.
  632.       IF(CFLAG(CEVINQ).AND.(CTICK(CEVINQ).NE.0)) I=12 ! open if inq in prog.
  633.       J=46                                      ! qdoor is open/closed.
  634.       IF(QOPEN(QDOOR)) J=12
  635.       CALL RSPSB2(710,I,J)
  636.       RETURN
  637. C
  638. C R52-- North Corridor
  639. C
  640. 52000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  641.       I=46
  642.       IF(QOPEN(CDOOR)) I=12                     ! cdoor is open/closed.
  643.       CALL RSPSUB(711,I)
  644.       RETURN
  645. C
  646. C R53-- Parapet
  647. C
  648. 53000 IF(PRSA.EQ.LOOKW) CALL RSPSUB(712,712+PNUMB)
  649.       RETURN
  650. C
  651. C R54-- Cell
  652. C
  653. 54000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  654.       I=721                                     ! cdoor is open/closed.
  655.       IF(QOPEN(CDOOR)) I=722
  656.       CALL RSPEAK(I)
  657.       I=46                                      ! odoor is open/closed.
  658.       IF(QOPEN(ODOOR)) I=12
  659.       IF(LCELL.EQ.4) CALL RSPSUB(723,I)         ! describe.
  660.       RETURN
  661. C
  662. C R55-- Prison Cell
  663. C
  664. 55000 IF(PRSA.EQ.LOOKW) CALL RSPEAK(724)        ! look?
  665.       RETURN
  666. C
  667. C R56-- Nirvana Cell
  668. C
  669. 56000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  670.       I=46                                      ! odoor is open/closed.
  671.       IF(QOPEN(ODOOR)) I=12
  672.       CALL RSPSUB(725,I)
  673.       RETURN
  674.  
  675. C RAPPLI, PAGE 15
  676. C
  677. C R57-- Nirvana and end of game
  678. C
  679. 57000 IF(PRSA.NE.WALKIW) RETURN                 ! walkin?
  680.       PAUSE '--More--'  
  681.       CALL RSPEAK(726)
  682.       PAUSE '--More--'  
  683.       CALL SCORE(.FALSE.)
  684.       STOP ' '
  685. C
  686. C R58-- Tomb Room
  687. C
  688. 58000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  689.       I=46                                      ! tomb is open/closed.
  690.       IF(QOPEN(TOMB)) I=12
  691.       CALL RSPSUB(792,I)
  692.       RETURN
  693. C
  694. C R59-- Puzzle Side Room
  695. C
  696. 59000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  697.       I=861                                     ! assume door closed.
  698.       IF(CPOUTF) I=862                          ! open?
  699.       CALL RSPEAK(I)                            ! describe.
  700.       RETURN
  701. C
  702. C R60-- Puzzle Room
  703. C
  704. 60000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  705.       IF(CPUSHF) GO TO 60100                    ! started puzzle?
  706.       CALL RSPEAK(868)                          ! no, describe.
  707.       IF((OFLAG2(WARNI).AND.TCHBT).NE.0) CALL RSPEAK(869)
  708.       RETURN
  709. C
  710. 60100 CALL CPINFO(880,CPHERE)                   ! describe room.
  711.       RETURN
  712.  
  713. C RAPPLI, PAGE 16
  714. C
  715. C R61-- Palantir Room
  716. C
  717. 61000 IF(PRSA.NE.LOOKW) GO TO 62400             ! look?
  718.       CALL RSPEAK(1015)
  719.       I=699                                     ! string is south.
  720.       GO TO 62100                               ! join common code.
  721. C
  722. C R62-- Prm Room
  723. C
  724. 62000 IF(PRSA.NE.LOOKW) GO TO 62400             ! look?
  725.       CALL RSPEAK(1016)                         ! string is north.
  726.       I=695
  727. C
  728. 62100 IF(PLOOKF) GO TO 62400                    ! thru window? skip door.
  729.       CALL RSPSUB(1017,I)
  730.       I=1018                                    ! assume lid open.
  731.       IF(.NOT.QOPEN(HERE-PRM+PLID1)) I=1019     ! closed.
  732.       CALL RSPEAK(I)                            ! describe lock.
  733.       DO 62200 I=1,OLNT                         ! loop through objects.
  734.         IF(OCAN(I).NE.(HERE-PRM+PKH1)) GO TO 62200
  735.         CALL RSPSUB(1020,ODESC2(I))             ! object in keyhole.
  736.         GO TO 62300
  737. 62200 CONTINUE
  738. C
  739. 62300 IF(QOPEN(PDOOR)) CALL RSPEAK(1042)        ! door open?
  740.       IF(.NOT.MATF) GO TO 62400                 ! mat under door?
  741.       CALL RSPEAK(1021)
  742.       IF((MATOBJ.NE.0).AND.((HERE.EQ.PALRM).OR.QOPEN(PDOOR)))
  743.      1CALL RSPSUB(1022,ODESC2(MATOBJ))                  ! obj on mat?
  744.       GO TO 62400
  745. C
  746. 62400 PLOOKF=.FALSE.                            ! clear window flag.
  747.       IF(PRSO.EQ.0) RETURN                      ! any object?
  748.       IF((PRSA.NE.TAKEW).OR..NOT.QEMPTY(HERE-PRM+PKH1).OR.
  749.      1 ((PRSO.NE.SCREW).AND.(PRSO.NE.STICK).AND.
  750.      2  (PRSO.NE.PKEY).AND.(PRSO.NE.KEYS))) GO TO 62500
  751.       IF(.NOT.PTOUCF) GO TO 62450               ! touched?
  752.       IF(QOPEN(HERE-PRM+PLID1)) CALL RSPEAK(1043)    ! lid closes.
  753.       OFLAG2(HERE-PRM+PLID1)=OFLAG2(HERE-PRM+PLID1).AND..NOT.OPENBT
  754. 62450 PTOUCF=.TRUE.                             ! touched now.
  755. C
  756. 62500 OFLAG1(SCREW)=OFLAG1(SCREW).AND..NOT.NDSCBT
  757.       IF((OCAN(SCREW).EQ.PKH1).OR.(OCAN(SCREW).EQ.PKH2))
  758.      1OFLAG1(SCREW)=OFLAG1(SCREW).OR.NDSCBT
  759.       OFLAG1(STICK)=OFLAG1(STICK).AND..NOT.NDSCBT
  760.       IF((OCAN(STICK).EQ.PKH1).OR.(OCAN(STICK).EQ.PKH2))
  761.      1OFLAG1(STICK)=OFLAG1(STICK).OR.NDSCBT
  762.       OFLAG1(PKEY)=OFLAG1(PKEY).AND..NOT.NDSCBT
  763.       IF((OCAN(PKEY).EQ.PKH1).OR.(OCAN(PKEY).EQ.PKH2))
  764.      1OFLAG1(PKEY)=OFLAG1(PKEY).OR.NDSCBT
  765.       OFLAG1(KEYS)=OFLAG1(KEYS).AND..NOT.NDSCBT
  766.       IF((OCAN(KEYS).EQ.PKH1).OR.(OCAN(KEYS).EQ.PKH2))
  767.      1OFLAG1(KEYS)=OFLAG1(KEYS).OR.NDSCBT
  768.       IF((OROOM(MAT).NE.PRM).AND.(OROOM(MAT).NE.PALRM)) MATF=.FALSE.
  769.       OFLAG1(MAT)=OFLAG1(MAT).AND..NOT.NDSCBT
  770.       IF(.NOT.MATF) RETURN
  771.       OFLAG1(MAT)=OFLAG1(MAT).OR.NDSCBT
  772.       CALL NEWSTA(MAT,0,HERE,0,0)
  773.       RETURN
  774.  
  775. C RAPPLI, PAGE 17
  776. C
  777. C R63-- Inslide
  778. C
  779. 63000 DO 63100 I=1,OLNT                         ! loop through objects
  780.         IF(.NOT.QHERE(I,HERE).OR.
  781.      1((OFLAG1(I).AND.TAKEBT).EQ.0)) GO TO 63100
  782.         CALL NEWSTA(I,0,CELLA,0,0)              ! drop to cellar,
  783.         IF(I.EQ.WATER) CALL NEWSTA(I,0,0,0,0)   ! unless water
  784.         CALL RSPSUB(1011,ODESC2(I))
  785. 63100 CONTINUE
  786.       RETURN
  787. C
  788. C R64-- Puzzle Anteroom
  789. C
  790. 64000 IF(PRSA.NE.LOOKW) RETURN                  ! look?
  791.       I=1068                                    ! not blocked.
  792.       IF(CPVEC(10).NE.0) I=1069                 ! blocked.
  793.       CALL RSPEAK(I)                            ! describe.
  794.       RETURN
  795. C
  796.       END
  797.  
  798. C LOOKTO--      Describe view in mirror hallway
  799. C
  800. C Declarations
  801. C
  802.       SUBROUTINE LOOKTO(NRM,SRM,NT,ST,HT)
  803.       IMPLICIT INTEGER (A-Z)
  804.       INCLUDE 'dparam.for'
  805. C
  806.       CALL RSPEAK(HT)                           ! describe hall.
  807.       CALL RSPEAK(NT)                           ! describe north view.
  808.       CALL RSPEAK(ST)                           ! describe south view.
  809.       DIR=0                                     ! assume no direction.
  810.       IF(IABS(MLOC-HERE).NE.1) GO TO 200        ! mirror to n or s?
  811.       IF(MLOC.EQ.NRM) DIR=695
  812.       IF(MLOC.EQ.SRM) DIR=699                   ! dir=n/s.
  813.       IF(MOD(MDIR,180).NE.0) GO TO 100          ! mirror n-s?
  814.       CALL RSPSUB(847,DIR)                      ! yes, he sees panel
  815.       CALL RSPSB2(848,DIR,DIR)                  ! and narrow rooms.
  816.       GO TO 200
  817. C
  818. 100   M1=MRHERE(HERE)                           ! which mirror?
  819.       MRBF=0                                    ! assume intact.
  820.       IF(((M1.EQ.1).AND..NOT.MR1F).OR.
  821.      1 ((M1.EQ.2).AND..NOT.MR2F)) MRBF=1        ! broken?
  822.       CALL RSPSUB(849+MRBF,DIR)                 ! describe.
  823.       IF((M1.EQ.1).AND.MROPNF) CALL RSPEAK(823+MRBF)
  824.       IF(MRBF.NE.0) CALL RSPEAK(851)
  825. C
  826. 200   I=0                                       ! assume no more to do.
  827.       IF((NT.EQ.0).AND.((DIR.EQ.0).OR.(DIR.EQ.699))) I=852
  828.       IF((ST.EQ.0).AND.((DIR.EQ.0).OR.(DIR.EQ.695))) I=853
  829.       IF((NT+ST+DIR).EQ.0) I=854
  830.       IF(HT.NE.0) CALL RSPEAK(I)                ! describe halls.
  831.       RETURN
  832. C
  833.       END
  834.  
  835. C EWTELL--      Describe e/w narrow rooms
  836. C
  837. C Declarations
  838. C
  839.       SUBROUTINE EWTELL(RM,ST)
  840.       IMPLICIT INTEGER (A-Z)
  841.       INCLUDE 'dparam.for'
  842.       LOGICAL M1
  843. C
  844. C Note that we are east or west of mirror, and
  845. C mirror must be n-s.
  846. C
  847.       M1=(MDIR+(MOD(RM-MRAE,2)*180)).EQ.180
  848.       I=MOD(RM-MRAE,2)                          ! get basic e/w flag.
  849.       IF((M1.AND..NOT.MR1F).OR.(.NOT.M1.AND..NOT.MR2F))
  850.      1I=I+2                                     ! mirror broken?
  851.       CALL RSPEAK(819+I)
  852.       IF(M1.AND.MROPNF) CALL RSPEAK(823+(I/2))
  853.       CALL RSPEAK(825)
  854.       CALL RSPEAK(ST)
  855.       RETURN
  856. C
  857.       END
  858.